/**
 * \file	IVisitor.h
 * \author	Caio Arce Nishibe (caionishibe@gmail.com)
 * \date	August, 2014
 * \brief	IVisitor interface header.
 */

#ifndef __IVISITOR_H
#define __IVISITOR_H

#include "ASTNode.h"


/**
 * \brief	Interface for a AST node visitor. 
 * \author	Caio Arce Nishibe (caionishibe@gmail.com)
 * \date	August, 2014
 */
class IVisitor
{
public:
	/**
	 * \brief Default constructor.
	 */
	IVisitor();
	/**
	 * \brief Destructor.
	 */
	virtual ~IVisitor();
	/**
	 * \brief	visit a Program node.
	 * \param	node	node to be visited.
	 */
	virtual void VisitProgram(ASTNode *node) = 0;
	/**
	* \brief	visit a Name node.
	* \param	node	node to be visited.
	*/
	virtual void VisitName(ASTNode *node) = 0;
	/**
	* \brief	visit a Variable node.
	* \param	node	node to be visited.
	*/
	virtual void VisitVariable(ASTNode *node) = 0;
	/**
	* \brief	visit a Rules node.
	* \param	node	node to be visited.
	*/
	virtual void VisitRules(ASTNode *node) = 0;
	/**
	* \brief	visit a Rules Set node.
	* \param	node	node to be visited.
	*/
	virtual void VisitRulesSet(ASTNode *node) = 0;
	/**
	* \brief	visit a Rule node.
	* \param	node	node to be visited.
	*/
	virtual void VisitRule(ASTNode *node) = 0;
	/**
	* \brief	visit a Condition node.
	* \param	node	node to be visited.
	*/
	virtual void VisitCondition(ASTNode *node) = 0;
	/**
	* \brief	visit a Logic Operator node.
	* \param	node	node to be visited.
	*/
	virtual void VisitLogicOperator(ASTNode *node) = 0;
	/**
	* \brief	visit a Internal Condition node.
	* \param	node	node to be visited.
	*/
	virtual void VisitInternalCondition(ASTNode *node) = 0;
	/**
	* \brief	visit a Comparation Operator node.
	* \param	node	node to be visited.
	*/
	virtual void VisitComparationOperator(ASTNode *node) = 0;
	/**
	* \brief	visit a Arithmetic Operator node.
	* \param	node	node to be visited.
	*/
	virtual void VisitArithmeticOperator(ASTNode *node) = 0;
	/**
	* \brief	visit a Arithmetic Expression node.
	* \param	node	node to be visited.
	*/
	virtual void VisitArithmeticExpression(ASTNode *node) = 0;
	/**
	* \brief	visit a Action node.
	* \param	node	node to be visited.
	*/
	virtual void VisitAction(ASTNode * node) = 0;
	/**
	* \brief	visit a Commands node.
	* \param	node	node to be visited.
	*/
	virtual void VisitCommand(ASTNode * node) = 0;
	/**
	* \brief	visit a Cmd node.
	* \param	node	node to be visited.
	*/
	virtual void VisitCmd(ASTNode *node) = 0;
	/**
	* \brief	visit a Assignment node.
	* \param	node	node to be visited.
	*/
	virtual void VisitAssignment(ASTNode *node) = 0;
	/**
	* \brief	visit a Read Sensor node.
	* \param	node	node to be visited.
	*/
	virtual void VisitReadSensor(ASTNode *node) = 0;
	/**
	* \brief	visit a Write Actuator node.
	* \param	node	node to be visited.
	*/
	virtual void VisitWriteActuator(ASTNode *node) = 0;
	/**
	 * \brief	visit a Message node.
	 * \param	node	node to be visited.
	 */
	virtual void VisitMessage(ASTNode *node) = 0;
	/**
	* \brief	visit a Identifier node.
	* \param	node	node to be visited.
	*/
	virtual void VisitIdentifier(ASTNode *node) = 0;
	/**
	* \brief	visit a Number node.
	* \param	node	node to be visited.
	*/
	virtual void VisitNumber(ASTNode *node) = 0;
};

#endif